package it.unipd.dei.bd.icineasti.database;

import it.unipd.dei.bd.icineasti.resource.Spettacolo;
import it.unipd.dei.bd.icineasti.resource.R_Proiettato;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
  * Aggiorna o inserisce nel database le informazioni sullo spettacolo
  *
  * @author Coccato Mattia
  * 
  */
public class CreaOAggiornaSpettacoloDatabase {
	
	private static final String STATEMENT_INSERT_SPETTACOLO = "INSERT INTO Spettacolo (dataPrenotabile, codicePalinsesto, valido) VALUES (?, ?, ?) RETURNING Codice;";
	private static final String STATEMENT_UPDATE_SPETTACOLO = "UPDATE Spettacolo SET dataPrenotabile = ?, codicePalinsesto = ?, valido = ? WHERE codice = ?;";

	private static final String STATEMENT_DELETE_SPETTACOLO = "UPDATE Spettacolo SET valido = FALSE WHERE codice = ?;";
	
	private static final String STATEMENT_INSERT_R_PROIETTATO = "INSERT INTO R_Proiettato (durata, codiceSpettacolo, idPrj, idSala) VALUES (?,?,?,?);";

	private final Connection con;

	private Spettacolo spettacolo;

	public CreaOAggiornaSpettacoloDatabase (Connection con, Spettacolo spettacolo) {
		this.con = con;
		this.spettacolo = spettacolo;
	}

	public int inserisciSpettacolo() throws SQLException {

		PreparedStatement pstmt = null;

 		int codiceSpettacolo = 0;

		try {
			pstmt = con.prepareStatement(STATEMENT_INSERT_SPETTACOLO);

			pstmt.setTimestamp(1, spettacolo.getDataPrenotabile());
			pstmt.setInt(2, spettacolo.getCodicePalinsesto());
			pstmt.setBoolean(3, spettacolo.getValido());

			ResultSet rs = pstmt.executeQuery();
			while (rs.next())
				codiceSpettacolo = rs.getInt(1);

			pstmt.close();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

		}

		return codiceSpettacolo;


	}

	public void aggiornaSpettacolo() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT_UPDATE_SPETTACOLO);

			pstmt.setTimestamp(1, spettacolo.getDataPrenotabile());
			pstmt.setInt(2, spettacolo.getCodicePalinsesto());
			pstmt.setBoolean(3, spettacolo.getValido());

			pstmt.setInt(4, spettacolo.getCodice());

			pstmt.execute();

			pstmt.close();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

		}
	}


	public void eliminaSpettacolo() throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT_DELETE_SPETTACOLO);

			pstmt.setInt(1, spettacolo.getCodice());

			pstmt.execute();

			pstmt.close();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

		}
	}

	public void inserisciInformazioneDiProiezione(R_Proiettato info) throws SQLException {

		PreparedStatement pstmt = null;

		try {
			pstmt = con.prepareStatement(STATEMENT_INSERT_R_PROIETTATO);

			pstmt.setInt(1, info.getDurata());
			pstmt.setInt(2, info.getCodiceSpettacolo());
			pstmt.setInt(3, info.getIdPrj());
			pstmt.setInt(4, info.getIdSala());

			pstmt.execute();

		} finally {
			if (pstmt != null) {
				pstmt.close();
			}

		}

	}
}
